package com.cskaoyan.javase.thread._2api;

import java.util.concurrent.TimeUnit;

/**
 * 线程中断方法:stop
 * public final void stop()
 * 该方法的作用简单明了，任何线程调用该方法，都会立刻强制终止执行。
 * 该方法不需要深入了解，因为该方法已经明确被注解@Deprecated标记了
 * 它是一个过时的方法，大家在开发中也不要使用这个方法来中断线程。
 *
 * 该方法之所以是一个过时的方法,是因为该方法的调用会为程序带来额外的风险:
 * 因为线程在stop中断时,无法预知线程的运行状态,那么程序员就无法作为相应的应对
 * 一个合理的下载线程应该能够执行以下操作:
 *      1.如果下载完成后,中断线程,那就无所谓,无事发生
 *      2.如果下载的过程中,中断线程,下载失败了,应该打印日志提醒用户,做出相应处理
 * 显然stop方法是无法完成上述操作的,因为stop时线程的执行状态是未知的
 *
 * 既然stop方法不能中断线程,那么如何合理的,安全的中断线程呢?
 * 合理的中断线程应该能够根据不同情况,做出不同处理:
 *      1.如果下载完成后,中断线程,那就无所谓,无事发生
 *      2.如果下载的过程中,中断线程,下载失败了,应该打印日志提醒用户,做出相应处理
 *
 * 线程的执行过程是随机的,在过程中是无法预知线程的执行状态的,但是线程终究是会执行完毕的
 * 所以中断线程并做出处理,不应该想着在中间过程中断,而是让该线程执行完毕
 *
 * @since 10:54
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class StopDemo {
    public static void main(String[] args) {
        DownloadThread dt = new DownloadThread("后台下载线程");
        dt.start();
        try {
            TimeUnit.SECONDS.sleep(10);
            dt.stop();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

class DownloadThread extends Thread {

    public DownloadThread(String name) {
        super(name);
    }

    @Override
    public void run() throws RuntimeException {
        int i = 10;
        for (; i <= 100; i += 10) {
            System.out.println("已下载" + i + "%");
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("下载已完成!");
    }
}

